//============================================================================================
/**
 * @file	generate_zone.c
 * @brief	大量発生ゾーン
 * @author	Nozomu Saitou
 *
 * @date	2006.05.13
 */
//============================================================================================
#include "common.h"
#include "fieldsys.h"		//for eventdata.h
#include "fielddata/maptable/zone_id.h"
#include "enc_tbl_change_def.h"
#include "encount_dat.h"
#include "eventdata.h"

#include "generate_zone.h"

#define GENERATE_ZONE_MAX	(20)

typedef struct GENE_INFO_tag
{
	u16 ZoneID;
	u16 GeneType;
}GENE_INFO;

static const GENE_INFO GeneInfoTbl[GENERATE_ZONE_MAX] =
{
	{ ZONE_ID_R01, GENE_TYPE_GROUND },
	{ ZONE_ID_R03, GENE_TYPE_GROUND },
	{ ZONE_ID_R09, GENE_TYPE_GROUND },
	{ ZONE_ID_R12, GENE_TYPE_FISHING },
	{ ZONE_ID_R13, GENE_TYPE_GROUND },
	{ ZONE_ID_W19, GENE_TYPE_WATER },
	{ ZONE_ID_R32, GENE_TYPE_FISHING },
	{ ZONE_ID_R25, GENE_TYPE_GROUND },
	{ ZONE_ID_R27, GENE_TYPE_WATER },
	{ ZONE_ID_R34, GENE_TYPE_GROUND },
	{ ZONE_ID_R35, GENE_TYPE_GROUND },
	{ ZONE_ID_R38, GENE_TYPE_GROUND },
	{ ZONE_ID_R44, GENE_TYPE_FISHING },
	{ ZONE_ID_R45, GENE_TYPE_GROUND },
	{ ZONE_ID_R47, GENE_TYPE_GROUND },
	{ ZONE_ID_D38R0101, GENE_TYPE_GROUND },
	{ ZONE_ID_D42R0102, GENE_TYPE_GROUND },
	{ ZONE_ID_D46R0101, GENE_TYPE_GROUND },
	{ ZONE_ID_T06, GENE_TYPE_WATER },
	{ ZONE_ID_T22, GENE_TYPE_FISHING },
};

//-----------------------------------------------------------------------------
/**
 * 大量発生する場所かを調べる
 *
 * @param	inRnadSeed			ランダムの種
 * @param	inZoneID
 * @param	inGeneType
 *
 * @return	BOOL		TURE：大量発生する場所　FALSE：大量発生しない場所
 */
//-----------------------------------------------------------------------------
BOOL GenerateZone_IsGeneratePlace(const u32 inRandSeed, const u16 inZoneID, const GENE_TYPE inGeneType)
{
	u8 idx;
	/* ---ゾーン決定方法--- */
	/*大量発生ランダムの種を大量発生ゾーンテーブル数で割った余りをインデックスとして*/
	/*大量発生ゾーンテーブルからゾーンＩＤを決定する*/
	idx = inRandSeed%GENERATE_ZONE_MAX;

	OS_Printf("idx = %d zone = %d GeneZone = %d type = %d GeneType = %d\n",
			idx, inZoneID, GeneInfoTbl[idx].ZoneID, inGeneType, GeneInfoTbl[idx].GeneType );
	if ( (inZoneID == GeneInfoTbl[idx].ZoneID)&&(inGeneType == GeneInfoTbl[idx].GeneType) ){
		return TRUE;
	}

	return FALSE;
}

//-----------------------------------------------------------------------------
/**
 * 大量発生情報（ゾーン、発生ポケモン）取得
 *
 * @param	inRnadSeed			ランダムの種
 * @param	outZone				ゾーン格納バッファ
 * @param	outMonsNo			モンスターナンバー格納バッファ
 *
 * @return	none
 */
//-----------------------------------------------------------------------------
void GenerateZone_GetInfo(const u32 inRandSeed, u16 *outZone, u16 *outMonsNo)
{
	GS_ENCOUNT_DATA enc_data;
	const GENE_INFO* pi;
	u32 rnd = (inRandSeed % GENERATE_ZONE_MAX);
//	rnd = 5;
	pi = &GeneInfoTbl[rnd];
	EventData_LoadEncountData(&enc_data, pi->ZoneID);

	switch(pi->GeneType){
	case GENE_TYPE_WATER:
		(*outMonsNo) = enc_data.WaterGenePoke;
		break;
	case GENE_TYPE_FISHING:
		(*outMonsNo) = enc_data.FishingGenePoke;
		break;
	case GENE_TYPE_GROUND:
		(*outMonsNo) = enc_data.GrndGenePoke;
		break;
	}
	GF_ASSERT_MSG((*outMonsNo),"大量発生エラー %d -> type = %d\n",rnd,pi->GeneType);
	(*outZone) = pi->ZoneID;
}